Supply the crate version via ENV vars
authorCarl Lerche <me@carllerche.com>
Thu, 24 Jul 2014 00:57:49 +0000 (17:57 -0700)
committerCarl Lerche <me@carllerche.com>
Thu, 24 Jul 2014 06:11:05 +0000 (23:11 -0700)
src/cargo/ops/cargo_rustc/mod.rs
tests/test_cargo_compile.rs

index 02bec0deba9cad2f7e1f178f5b5e4b3232ff9572..c4b3199738391545d3298325c0ccc09003f60fd4 100644 (file)
@@ -1,5 +1,6 @@
 use std::io::{fs, UserRWX};
 use std::collections::HashSet;
+use semver::Version;
 
 use core::{Package, PackageId, PackageSet, Target, Resolve};
 use util;
@@ -144,8 +145,7 @@ fn compile_custom(pkg: &Package, cmd: &str,
     //       be building a C lib for a plugin
     let layout = cx.layout(false);
     let output = layout.native(pkg);
-    let mut p = util::process(cmd.next().unwrap())
-                     .cwd(pkg.get_root())
+    let mut p = process(cmd.next().unwrap(), pkg)
                      .env("OUT_DIR", Some(&output))
                      .env("DEPS_DIR", Some(&output))
                      .env("TARGET", cx.config.target());
@@ -204,9 +204,7 @@ fn rustc(package: &Package, target: &Target,
 
 fn prepare_rustc(package: &Package, target: &Target, crate_types: Vec<&str>,
                  cx: &Context, req: PlatformRequirement) -> Vec<ProcessBuilder> {
-    let root = package.get_root();
-
-    let base = util::process("rustc").cwd(root.clone());
+    let base = process("rustc", package);
     let base = build_base_args(base, target, crate_types.as_slice());
 
     let target_cmd = build_plugin_args(base.clone(), cx, false);
@@ -356,3 +354,27 @@ fn build_deps_args(mut cmd: ProcessBuilder, target: &Target, package: &Package,
         }
     }
 }
+
+pub fn process<T: ToCStr>(cmd: T, pkg: &Package) -> ProcessBuilder {
+    util::process(cmd)
+        .cwd(pkg.get_root())
+        .env("CARGO_PKG_VERSION_MAJOR", Some(pkg.get_version().major.to_string()))
+        .env("CARGO_PKG_VERSION_MINOR", Some(pkg.get_version().minor.to_string()))
+        .env("CARGO_PKG_VERSION_PATCH", Some(pkg.get_version().patch.to_string()))
+        .env("CARGO_PKG_VERSION_PRE", pre_version_component(pkg.get_version()))
+}
+
+fn pre_version_component(v: &Version) -> Option<String> {
+    if v.pre.is_empty() {
+        return None;
+    }
+
+    let mut ret = String::new();
+
+    for (i, x) in v.pre.iter().enumerate() {
+        if i != 0 { ret.push_char('.') };
+        ret.push_str(x.to_string().as_slice());
+    }
+
+    Some(ret)
+}
index 9c1c6d548ef8e8a0ad28f58c4cb2c56a46782b38..cd29b9903bf6f0c8db8a2f45a22b627a96dc4a00 100644 (file)
@@ -740,6 +740,42 @@ test!(custom_build_env_vars {
     assert_that(p.cargo_process("cargo-build"), execs().with_status(0));
 })
 
+test!(crate_version_env_vars {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [project]
+
+            name = "foo"
+            version = "0.5.1-alpha.1"
+            authors = ["wycats@example.com"]
+
+            [[bin]]
+            name = "foo"
+        "#)
+        .file("src/foo.rs", r#"
+            use std::os;
+
+            static VERSION_MAJOR: &'static str = env!("CARGO_PKG_VERSION_MAJOR");
+            static VERSION_MINOR: &'static str = env!("CARGO_PKG_VERSION_MINOR");
+            static VERSION_PATCH: &'static str = env!("CARGO_PKG_VERSION_PATCH");
+            static VERSION_PRE: &'static str = env!("CARGO_PKG_VERSION_PRE");
+
+            fn main() {
+                println!("{}-{}-{} @ {}",
+                         VERSION_MAJOR,
+                         VERSION_MINOR,
+                         VERSION_PATCH,
+                         VERSION_PRE);
+            }
+        "#);
+
+    assert_that(p.cargo_process("cargo-build"), execs().with_status(0));
+
+    assert_that(
+      process(p.bin("foo")),
+      execs().with_stdout("0-5-1 @ alpha.1\n"));
+})
+
 test!(custom_build_in_dependency {
     let mut p = project("foo");
     let bar = p.root().join("bar");